home *** CD-ROM | disk | FTP | other *** search
- /*--- DEMO.C ----------------------------- Listing 1 ------------
- * Lists available fonts under Windows and shows approxi-
- * mately what the printer versions look like. Requires SDK.
- * Compiles under MSC 5.0-6.00A
- *
- * by Michael Young. Object code may be used freely. Source
- * code may be used freely if authorship and publication are
- * caknowledged.
- *-------------------------------------------------------------*/
- #define _WINDOWS
- #include <windows.h>
- #include <stdio.h>
- #include <string.h>
-
- #define IDC_BOLD 100
- #define IDC_FONTLIST 110
- #define IDC_ITALIC 120
- #define IDC_PRNNAME 130
- #define IDC_SIZELIST 140
- #define IDC_UNDERLINE 150
-
- HWND HBold;
- HFONT HFont = NULL;
- HWND HFontList;
- HANDLE HInst;
- HWND HItalic;
- HDC HPrnIC = NULL;
- HWND HSizeList;
- HWND HUnderline;
- HDC HWinDC = NULL;
- HWND HWindow;
- int FontSize;
- LOGFONT LF;
- int NumSizes;
- char PrinterName [32];
- RECT Rect;
- int SizeList [25];
- TEXTMETRIC TM;
- int VectorFont;
- static int VectorSizes [] = { 6*20, 8*20, 10*20, 12*20, 14*20,
- 18*20, 24*20, 30*20, 36*20, 48*20};
-
- int FAR PASCAL EnumFaceNames (LPLOGFONT PtrLF,
- LPTEXTMETRIC PtrTM,
- short FontType,
- LPSTR PtrData);
- int FAR PASCAL EnumSizes (LPLOGFONT PtrLF,
- LPTEXTMETRIC PtrTM,
- short FontType,
- LPSTR PtrData);
- void GetPrnIC (void);
- BOOL InitInstance (HANDLE hInstance, int nCmdShow);
- BOOL InitProgram (HANDLE hInstance);
- long FAR PASCAL MainWndProc (HWND hWnd,unsigned message,
- WORD wParam,LONG lParam);
-
- int PASCAL WinMain
- (HANDLE hInstance,
- HANDLE hPrevInstance,
- LPSTR lpCmdLine,
- int nCmdShow)
- {
- MSG Msg;
-
- if (!hPrevInstance)
- if (!InitProgram (hInstance))
- return (FALSE);
- if (!InitInstance (hInstance, nCmdShow))
- return (FALSE);
- while (GetMessage
- (&Msg,
- NULL,
- NULL,
- NULL))
- {
- TranslateMessage (&Msg);
- DispatchMessage (&Msg);
- }
- return (Msg.wParam);
- } /* end WinMain */
-
- int FAR PASCAL EnumFaceNames (LPLOGFONT PtrLF,LPTEXTMETRIC PtrTM,
- short FontType,LPSTR PtrData)
- {
- SendMessage
- (HFontList,
- LB_ADDSTRING,
- NULL,
- (DWORD)(LPSTR)PtrLF->lfFaceName);
- return (1);
- } /* end EnumFaceNames */
-
- int FAR PASCAL EnumSizes (LPLOGFONT PtrLF,LPTEXTMETRIC PtrTM,
- short FontType,LPSTR PtrData)
- {
- int i;
- int PointSize;
-
- LF = *PtrLF;
- if (!(FontType & RASTER_FONTTYPE))
- {
- VectorFont = 1;
- return (0);
- }
- if (NumSizes >= 25)
- return (0);
- PointSize = (PtrTM->tmHeight -
- PtrTM->tmInternalLeading + 10) / 20;
- PointSize = PointSize * 20 + 9;
- for (i = 0; i < NumSizes; ++i)
- {
- if (SizeList [i] == PointSize)
- return (1);
- if (SizeList [i] > PointSize)
- {
- memmove (SizeList + i + 1,SizeList + i,
- (NumSizes - i) * sizeof (int));
- break;
- }
- }
- SizeList [i] = PointSize;
- ++NumSizes;
- return (1);
- } /* end EnumSizes */
-
- void GetPrnIC (void)
- {
- char PrnInfo [80];
- char *PtrPrnDriver;
- char *PtrPrnName;
- char *PtrPrnPort;
- int Result;
-
- Result = GetProfileString
- ("windows",
- "device",
- (LPSTR)"",
- PrnInfo,
- sizeof (PrnInfo));
- if (Result == 0 || !PrnInfo [0])
- return;
- PtrPrnName = strtok (PrnInfo,",");
- PtrPrnDriver = strtok (NULL,", ");
- PtrPrnPort = strtok (NULL,", ");
- if (!PtrPrnName || !PtrPrnDriver || !PtrPrnPort)
- return;
- strcpy (PrinterName,PtrPrnName);
- HPrnIC = CreateIC
- (PtrPrnDriver,
- PtrPrnName,
- PtrPrnPort,
- NULL);
- if (HPrnIC == NULL)
- return;
- SetMapMode (HPrnIC,MM_ANISOTROPIC);
- SetWindowExt (HPrnIC,1440,1440);
- SetViewportExt
- (HPrnIC,
- GetDeviceCaps (HPrnIC,LOGPIXELSX),
- GetDeviceCaps (HPrnIC,LOGPIXELSY));
- return;
- } /* end GetPrnIC */
-
- BOOL InitInstance
- (HANDLE hInstance,
- int hCmdShow)
- {
- LONG DlgBaseUnits;
- HDC HWinDC;
- int Index;
- FARPROC ProcAddr;
-
- HInst = hInstance;
- DlgBaseUnits = GetDialogBaseUnits ();
- Rect.left = (5 * LOWORD (DlgBaseUnits)) / 4;
- Rect.top = (100 * HIWORD (DlgBaseUnits)) / 8;
- Rect.right = (130 * LOWORD (DlgBaseUnits)) / 4;
- Rect.bottom = (142 * HIWORD (DlgBaseUnits)) / 8;
- HWindow = CreateWindow
- ("DemoClass", /* Class name passed
- to RegisterClass. */
- "Printer Font Viewer", /* Text for window title. */
- WS_BORDER | /* Window style: */
- WS_CAPTION |
- WS_MINIMIZEBOX |
- WS_SYSMENU |
- WS_VISIBLE,
- CW_USEDEFAULT, /* Horz. position: use default. */
- CW_USEDEFAULT, /* Vert. position: use default. */
- (130 * LOWORD (DlgBaseUnits)) / 4, /* Window width. */
- (142 * HIWORD (DlgBaseUnits)) / 8, /* Window height.*/
- NULL, /* Parent: none. */
- NULL, /* Menu: use class menu. */
- HInst, /* Instance to be associated
- with window. */
- NULL); /* Pointer value passed
- to window: none. */
- if (!HWindow)
- return (FALSE);
- HWinDC = GetDC (HWindow);
- SetMapMode
- (HWinDC,
- MM_ANISOTROPIC);
- SetWindowExt (HWinDC,1440,1440);
- SetViewportExt
- (HWinDC,
- GetDeviceCaps (HWinDC,LOGPIXELSX),
- GetDeviceCaps (HWinDC,LOGPIXELSY));
- SetViewportOrg
- (HWinDC,
- (5 * LOWORD (DlgBaseUnits)) / 4,
- (100 * HIWORD (DlgBaseUnits)) / 8);
- ReleaseDC (HWindow,HWinDC);
- ShowWindow
- (HWindow,
- hCmdShow);
- GetPrnIC ();
- GetTextMetrics (HPrnIC,&TM);
- FontSize = (TM.tmHeight -
- TM.tmInternalLeading + 10) / 20;
- FontSize = FontSize * 20 + 9;
- GetTextFace (HPrnIC,LF_FACESIZE,LF.lfFaceName);
- CreateWindow
- ("STATIC",
- "Printer:",
- WS_CHILD |
- WS_VISIBLE |
- SS_LEFT,
- (5 * LOWORD (DlgBaseUnits)) / 4,
- (5 * HIWORD (DlgBaseUnits)) / 8,
- (25 * LOWORD (DlgBaseUnits)) / 4,
- (8 * HIWORD (DlgBaseUnits)) / 8,
- HWindow,
- -1,
- HInst,
- NULL);
- CreateWindow
- ("STATIC",
- PrinterName,
- WS_CHILD |
- WS_VISIBLE |
- SS_LEFT,
- (31 * LOWORD (DlgBaseUnits)) / 4,
- (5 * HIWORD (DlgBaseUnits)) / 8,
- (96 * LOWORD (DlgBaseUnits)) / 4,
- (8 * HIWORD (DlgBaseUnits)) / 8,
- HWindow,
- IDC_PRNNAME,
- HInst,
- NULL);
- CreateWindow
- ("STATIC",
- "Typeface:",
- WS_CHILD |
- WS_VISIBLE |
- SS_LEFT,
- (5 * LOWORD (DlgBaseUnits)) / 4,
- (17 * HIWORD (DlgBaseUnits)) / 8,
- (35 * LOWORD (DlgBaseUnits)) / 4,
- (8 * HIWORD (DlgBaseUnits)) / 8,
- HWindow,
- -1,
- HInst,
- NULL);
- CreateWindow
- ("STATIC",
- "Size:",
- WS_CHILD |
- WS_VISIBLE |
- SS_LEFT,
- (88 * LOWORD (DlgBaseUnits)) / 4,
- (17 * HIWORD (DlgBaseUnits)) / 8,
- (27 * LOWORD (DlgBaseUnits)) / 4,
- (8 * HIWORD (DlgBaseUnits)) / 8,
- HWindow,
- -1,
- HInst,
- NULL);
- HFontList = CreateWindow
- ("LISTBOX",
- "",
- WS_CHILD |
- WS_VSCROLL |
- WS_VISIBLE |
- LBS_STANDARD,
- (5 * LOWORD (DlgBaseUnits)) / 4,
- (28 * HIWORD (DlgBaseUnits)) / 8,
- (76 * LOWORD (DlgBaseUnits)) / 4,
- (57 * HIWORD (DlgBaseUnits)) / 8,
- HWindow,
- IDC_FONTLIST,
- HInst,
- NULL);
- HSizeList = CreateWindow
- ("LISTBOX",
- "",
- WS_CHILD |
- WS_VSCROLL |
- WS_VISIBLE |
- WS_BORDER |
- LBS_NOTIFY,
- (88 * LOWORD (DlgBaseUnits)) / 4,
- (28 * HIWORD (DlgBaseUnits)) / 8,
- (36 * LOWORD (DlgBaseUnits)) / 4,
- (57 * HIWORD (DlgBaseUnits)) / 8,
- HWindow,
- IDC_SIZELIST,
- HInst,
- NULL);
- HBold = CreateWindow
- ("BUTTON",
- "Bold",
- WS_CHILD |
- WS_VISIBLE |
- BS_AUTOCHECKBOX,
- (5 * LOWORD (DlgBaseUnits)) / 4,
- (88 * HIWORD (DlgBaseUnits)) / 8,
- (28 * LOWORD (DlgBaseUnits)) / 4,
- (12 * HIWORD (DlgBaseUnits)) / 8,
- HWindow,
- IDC_BOLD,
- HInst,
- NULL);
- SendMessage
- (HBold,
- BM_SETCHECK,
- TM.tmWeight == 700,
- NULL);
- HItalic = CreateWindow
- ("BUTTON",
- "Italic",
- WS_CHILD |
- WS_VISIBLE |
- BS_AUTOCHECKBOX,
- (43 * LOWORD (DlgBaseUnits)) / 4,
- (88 * HIWORD (DlgBaseUnits)) / 8,
- (28 * LOWORD (DlgBaseUnits)) / 4,
- (12 * HIWORD (DlgBaseUnits)) / 8,
- HWindow,
- IDC_ITALIC,
- HInst,
- NULL);
- SendMessage
- (HItalic,
- BM_SETCHECK,
- TM.tmItalic,
- NULL);
- HUnderline = CreateWindow
- ("BUTTON",
- "Underline",
- WS_CHILD |
- WS_VISIBLE |
- BS_AUTOCHECKBOX,
- (82 * LOWORD (DlgBaseUnits)) / 4,
- (88 * HIWORD (DlgBaseUnits)) / 8,
- (43 * LOWORD (DlgBaseUnits)) / 4,
- (12 * HIWORD (DlgBaseUnits)) / 8,
- HWindow,
- IDC_UNDERLINE,
- HInst,
- NULL);
- SendMessage
- (HUnderline,
- BM_SETCHECK,
- TM.tmUnderlined,
- NULL);
- ProcAddr = MakeProcInstance (EnumFaceNames,HInst);
- EnumFonts (HPrnIC,NULL,ProcAddr,NULL);
- FreeProcInstance (ProcAddr);
- Index = SendMessage
- (HFontList,
- LB_FINDSTRING,
- -1,
- (DWORD)(LPSTR)LF.lfFaceName);
- SendMessage
- (HFontList,
- LB_SETCURSEL,
- Index,
- NULL);
- SendMessage
- (HWindow,
- WM_COMMAND,
- IDC_FONTLIST,
- MAKELONG (0,LBN_SELCHANGE));
- return (TRUE);
- } /* end InitInstance */
-
- BOOL InitProgram
- (HANDLE hInstance)
- {
- WNDCLASS WC;
-
- /* Style: private device context. */
- WC.style = CS_OWNDC;
- /* Window function. */
- WC.lpfnWndProc = MainWndProc;
- /* Extra data for class: none. */
- WC.cbClsExtra = 0;
- /* Extra data for instance: none. */
- WC.cbWndExtra = 0;
- /* Program instance that owns class */
- WC.hInstance = hInstance;
- /* Load/assign class icon.*/
- WC.hIcon = LoadIcon (NULL, IDI_APPLICATION);
- /* Load/assign cl. cursor.*/
- WC.hCursor = LoadCursor (NULL, IDC_ARROW);
- /* Background brush. */
- WC.hbrBackground = GetStockObject (WHITE_BRUSH);
- /* Default class menu: none. */
- WC.lpszMenuName = NULL;
- /* Name of window class. */
- WC.lpszClassName = "DemoClass";
- /* Register window class/return code*/
- return (RegisterClass (&WC));
- } /* end InitProgram */
-
- long FAR PASCAL MainWndProc
- (HWND hWnd,
- WORD wMsg,
- WORD wParam,
- LONG lParam)
- {
- char Buffer [LF_FACESIZE];
- int Checked;
- HFONT HFontOld;
- HDC HWinDC;
- int i;
- int IdxDefault;
- int Index;
- PAINTSTRUCT PaintStruct;
- int PrevPoints;
- FARPROC ProcAddr;
-
- switch (wMsg)
- {
- case WM_COMMAND:
- switch (wParam)
- {
- case IDC_BOLD:
- switch (HIWORD (lParam))
- {
- case BN_CLICKED:
- Checked = SendMessage (HBold,BM_GETCHECK,
- NULL,NULL);
- LF.lfWeight = Checked ? 700 : 400;
- if (HFont != NULL)
- DeleteObject (HFont);
- HFont = CreateFontIndirect (&LF);
- InvalidateRect (HWindow,&Rect,TRUE);
- UpdateWindow (HWindow);
- return (NULL);
- default:
- return (DefWindowProc (hWnd,wMsg,wParam,lParam));
- }
- case IDC_FONTLIST:
- switch (HIWORD (lParam))
- {
- case LBN_SELCHANGE:
- Index = SendMessage
- (HFontList,
- LB_GETCURSEL,
- 0,
- 0L);
- SendMessage
- (HFontList,
- LB_GETTEXT,
- Index,
- (DWORD)(LPSTR)Buffer);
- SendMessage
- (HSizeList,
- LB_RESETCONTENT,
- 0,
- 0L);
- NumSizes = 0;
- VectorFont = 0;
- ProcAddr = MakeProcInstance (EnumSizes,HInst);
- EnumFonts (HPrnIC, Buffer, ProcAddr,NULL);
- FreeProcInstance (ProcAddr);
- LF.lfWidth = 0;
- Checked = SendMessage (HBold,
- BM_GETCHECK,NULL,NULL);
- LF.lfWeight = Checked ? 700 : 400;
- Checked = SendMessage (HItalic,
- BM_GETCHECK,NULL,NULL);
- LF.lfItalic = Checked;
- Checked = SendMessage (HUnderline,
- BM_GETCHECK,NULL,NULL);
- LF.lfUnderline = Checked;
- if (VectorFont)
- {
- memcpy (SizeList,VectorSizes,
- sizeof (VectorSizes));
- NumSizes = sizeof (VectorSizes) /
- sizeof (int);
- }
- PrevPoints = 0;
- IdxDefault = 0;
- for (i = 0; i < NumSizes; ++i)
- {
- sprintf (Buffer,"%d",SizeList [i] / 20);
- SendMessage
- (HSizeList,
- LB_ADDSTRING,
- NULL,
- (DWORD)(LPSTR)Buffer);
- if (SizeList [i] > PrevPoints &&
- SizeList [i] <= FontSize)
- {
- PrevPoints = SizeList [i];
- IdxDefault = i;
- }
- }
- SendMessage
- (HSizeList,
- LB_SETCURSEL,
- IdxDefault,
- NULL);
- SendMessage (HWindow,WM_COMMAND,IDC_SIZELIST,
- MAKELONG (0,LBN_SELCHANGE));
- return (NULL);
- default:
- return (DefWindowProc (hWnd,wMsg,
- wParam,lParam));
- }
- case IDC_ITALIC:
- switch (HIWORD (lParam))
- {
- case BN_CLICKED:
- Checked = SendMessage (HItalic,BM_GETCHECK,
- NULL,NULL);
- LF.lfItalic = Checked;
- if (HFont != NULL)
- DeleteObject (HFont);
- HFont = CreateFontIndirect (&LF);
- InvalidateRect (HWindow,&Rect,TRUE);
- UpdateWindow (HWindow);
- return (NULL);
- default:
- return (DefWindowProc (hWnd,wMsg,wParam,lParam));
- }
- case IDC_SIZELIST:
- switch (HIWORD(lParam))
- {
- case LBN_SELCHANGE:
- Index = SendMessage (HSizeList,
- LB_GETCURSEL,
- 0,
- 0L);
- FontSize = SizeList [Index];
- LF.lfHeight = -SizeList [Index];
- if (HFont != NULL)
- DeleteObject (HFont);
- HFont = CreateFontIndirect (&LF);
- InvalidateRect (HWindow,&Rect,TRUE);
- UpdateWindow (HWindow);
- return (NULL);
- default:
- return (DefWindowProc (hWnd, wMsg,
- wParam, lParam));
- }
- case IDC_UNDERLINE:
- switch (HIWORD (lParam))
- {
- case BN_CLICKED:
- Checked = SendMessage (HUnderline,
- BM_GETCHECK,NULL,NULL);
- LF.lfUnderline = Checked;
- if (HFont != NULL)
- DeleteObject (HFont);
- HFont = CreateFontIndirect (&LF);
- InvalidateRect (HWindow,&Rect,TRUE);
- UpdateWindow (HWindow);
- return (NULL);
- default:
- return (DefWindowProc (hWnd,wMsg,
- wParam,lParam));
- }
- default:
- return (DefWindowProc (hWnd, wMsg, wParam, lParam));
- }
- case WM_DESTROY:
- PostQuitMessage (0);
- return (NULL);
- case WM_PAINT:
- HWinDC = BeginPaint (HWindow, &PaintStruct);
- HFontOld = SelectObject (HWinDC,HFont);
- TextOut
- (HWinDC,
- 0,
- 0,
- "Abcdefghijklmnopqrstuvwxyz",
- 26);
- SelectObject (HWinDC,HFontOld);
- EndPaint (HWindow,&PaintStruct);
- return (NULL);
- default:
- return (DefWindowProc (hWnd, wMsg, wParam, lParam));
- } /* end switch */
- } /* end MainWndProc */